9장. 소프트웨어는 여전히 고객을 위한 것입니다.

  1. 9장. 소프트웨어는 여전히 고객을 위한 것입니다.
    1. 1. 개요
    2. 2. 개발의 두가지 접근방식
    3. 3. 특징 주도 개발방법 사용하기
    4. 4. 공통점 분석(commonality analysis)
    5. 5. 좋은 테스트케이스 만들기
    6. 6. 약정에 의한 프로그래밍과 방어적 프로그래밍
    7. 문서에 대하여

1. 개요

앞에서 나온 여러 장을 통해서 우리는 분석,설계를 위한 여러가지 도구와 기법을 배웠다.
하지만 고객은 객체지향원리나 다이어그램 따위에는 신경쓰지 않으며, 단지 자신이 요청한 소프트웨어가 의도한 대로 작동하기만을 바란다.
그리고 잘 진행되고 있다는 것을 문서가 아닌, 컴퓨터에서 돌아가고 있는 어플리케이션으로 보기를 원한다.
그러므로 우리는 한번에 전체의 어플리케이션을 보여줄 수 는 없지만, 고객이 안심할 수 있도록 보여줄 수 있는 부분을 구현을 하며, 부분구현의 반복작업을 통해 전체의 어플리케이션을 완성한다.
이러한 반복작업은 두가지의 기본적인 접근 방식이 있다.

2. 개발의 두가지 접근방식

2.1. 특징 주도 개발(Feature driven development)

어플리케이션의 특정한 특징을 선택하고, 완성될때까지 그 특징을 계획, 분석, 개발하는 것.
한번에 하나의 특징을 작업하고 그리고 나서 반복하여, 어플리케이션의 기능을 완성할 때까지 한번에 하나씩 특징들을 구현한다.

2.2. 유스테이스 주도 개발(Use case driven development)

유스케이스의 시나리오를 선택하여 시나리오가 완성될 때까지 코드를 작성하는 것.
유스케이스 내에서 하나의 시나리오를 완성하는 작업을 한다. 그 다음 또 다른 시나리오를 선택하여 작업하며, 유스케이스느이 모든 시나리오가 완성될 때까지 반복한다. 그리고 나서, 다음 유스케이스를 선택하여 위의 작업을 하며, 모든 유스케이스가 작동할 때까지 반복한다.

2.3 두가지 접근방식의 특징

특징 주도 개발유스케이스 주도 개발
  • 더 세분화된 모양
  • 서로 별로 연결되어 있지 않은 특징들이 많을때 잘 동작
  • 고객에게 동작하는 코드를 빨리 보여줄 수 있다
  • 매우 기능주도적이다. 어떠한 특징도 빠트리는 경우가 없음
  • 연결되어 있지 않은 기능의 조작들이 많은 시스템이세 특히 잘 동작한다
  • 더 큰 그림의 모양
  • 독립적인 기능보다는 많은 프로세스와 시나리오를 가지고 있는 애플리케이션의 경우 잘 동작
  • 고객에게 각 개발단계마다, 더 큰 단위의 기능조각을 보여줄 수 있다.
  • 매우 사용자 중심적이다. 사용자가 시스템을 사용하는 여러 방법들을 모두 고려하여 코딩하게됨
  • 길고 복잡한 프로세스를 가진 트랜잭션 시스템에서 특히 잘 동작한다.

3. 특징 주도 개발방법 사용하기

3.1 게리의 게임시스템 프레임웍 특징 리스트

게리의 게임시스템 프레임웍 특징 리스트
  1. 프레임웍은 다양한 타입의 지형을 지원한다.
  2. 프레임웍은 공상 과학 소설이나 판타지 소설에 등장하는 가상의 시대를 포함한 다양한 시대를 지원한다.
  3. 프레임웍은 게임의 특성에 맞는 여러 타입의 부대들 또는 유닛들을 지원한다.
  4. 프레임웍은 새로운 작전 수행이나 전쟁 시나리오를 위한 추가 모듈을 지원한다.
  5. 프레임웍은 사각형의 타일들로 구성된 보드를 제공하고 각 타일은 지형타입을 가지고 있다.
  6. 프레임웍은 누구의 차례인지에 대한 정보를 유지한다.
  7. 프레임웍은 기본적인 이동을 관장한다.

3.2 Unit 클래스 구체화하기

게리의 비전 기술서를 통해 게리가 프레임웍 내의 유닛들에게 바라는 기능에 대해서 제안

  1. 각각의 유닛은 속성들을 가져야 하고, 게임 설계자들은 자신의 게임 내의 유닛 타입에 새로운 속성들을 추가할 수 있다.
  2. 유닛들은 보드 위의 한 타일에서 다른 타일로 이동할 수 있어야 한다.
  3. 유닛들은 그룹지어 부대가 될 수 있다.
Unit
type:String
propertes:Map
setType(String)
getType():String
setProperty(String, Object)
getProperty(String):Object

3.3 테스트 시나리오 작성하기

고객은 스스로 납득할만한 무언가를 보고 싶어한다. 그러므로 클래스 다이어그램으로 고객을 납득시키기에는 무리가 있으므로, 우리는 고객에게 보여줄 테스트 시나리오늘 제시할 필요가 있다.
이렇게 하는 것은 우리가 작성한 코드가 작동된다는 것과 고객이 원하는대로 동작한다는 것을 입증하는 길이다.

테스트케이스가 복잡할 필요는 없으며, 단지 고객에게 클래스의 기능이 정확하게 동작하고 있다는 것을 보여주면된다.

유닛의 속성에 대해서, 하나의 유닛을 생성하고 유닛에 속성하나를 추가하는 간단한 테스트 시나리오 작성

테스트 케이스

  • 속성값 설정하고 가져오기
  • 속성값 바꾸기
  • 존재하지 않는 속성 값 가져오기

자신의 소프트웨어를 생각할 수 있는 모든 가능한 방법으로 테스트 해야함. 소프트웨어의 잘못된 사용방법에 대해서도 테스트 해야 함.

4. 공통점 분석(commonality analysis)

Unit 클래스의 속성을 모든 유닛이 가질수 있는 속성과 특정 타입의 유닛들만 가질수 있는 속성으로 분리하여 클래스의 변경계획 세우기

4.1 공통점 강조하기

유닛의 공통속성들은 속성 Map 밖으로 빼내고, 변하는 속성은 Map안에 남겨둔다.

Unit
type:String
propertes:Map
{color:red}id:int
name:String
weapons:Weapon *{color}
setType(String)
getType():String
setProperty(String, Object)
getProperty(String):Object
{color:red}getId():int
setName(String)
getName():String
addWeapon(Weapon)
getWeapons():Weapon * {color}

Trade Off

  1. 중복이 존재-공통의 속성인 경우 속성들에 접근하는 두가지 방법이 존재하게 된다.
  2. 유지보수-공통속성은 해당 속성이 직접코딩되어있는 속성이름을 가지게 됨, 만약 설계자가 이것들의 사용을 원치않으면 Unit 클래스를 변경해야 함

4.2 캡슐화 강조하기

모든 종류의 유닛 속성들을 모두 캡슐화하여 속성 Map에 저장한다.

Unit
type:String
propertes:Map
setType(String)
getType():String
setProperty(String, Object)
getProperty(String):Object

Trade Off

  1. 공통점을 무시-모든 종류의 속성을 속성Map에 저장하므로 어떤것들이 공통속성으로 사용될 것인지를 파악불가
  2. 런타임시의 많은 작업들-getProperty()는 Object를 반환하므로 실행시 공통속성조차도 형변환과 같은 부가적인 일들을 수행해야 함.

5. 좋은 테스트케이스 만들기

  1. 각 테스트 케이스는 아이디와 이름을 가지고 있어야 한다.
  2. 각 테스트 케이스는 그것이 테스트하는 특정한 것 하나를 테스트 해야 한다.
  3. 각 테스트 케이스는 여러분이 제공하는 입력 값을 가지고 있어야 한다.
  4. 각 테스트 케이스는 예상되는 출력값을 가지고 있어야 한다.
  5. 대부분의 테스트 케이스는 초기상태를 가지고 있다.

6. 약정에 의한 프로그래밍과 방어적 프로그래밍

6.1 약정에 의한 프로그래밍

약정에 의해 프로그램을 작성할 때 당신과 당신의 프로그램 사용자는 소프트웨어가 어떤 방식으로 동작할 것이라는 것에 동의하고 있는 것이다.

6.2 방어적 프로그래밍

고객이 어떠한 일이 발생되기를 원하건 간에 고객이 안전한 응답을 얻도록 확인

문서에 대하여